/*
 * kalkulator.cpp
 *
 *  Created on: Feb 26, 2009
 *      Author: karol
 */

#include <iostream>
#include <stack>
#include <cstdlib>

#include "definicje.h"

extern int value;
extern int charCount;
int getLeksem();

void error() {
	std::cerr << "Niepoprawne wejscie - znak nr : " << charCount << ". Koncze dzialanie" << std::endl;
	exit(1);
}

int main() {
	int x;
	std::stack<int> stos;
	int a, b;
	while(x = getLeksem()) {
		switch(x) {
			case NUM:
				stos.push(value);
				break;
			case PLUS:
				if(stos.size() < 2) error();
				a = stos.top();
				stos.pop();
				b = stos.top();
				stos.pop();
				stos.push(b + a);
				break;
			case MINUS:
				if(stos.size() < 2) error();
				a = stos.top();
				stos.pop();
				b = stos.top();
				stos.pop();
				stos.push(b - a);
				break;
			case RAZY:
				if(stos.size() < 2) error();
				a = stos.top();
				stos.pop();
				b = stos.top();
				stos.pop();
				stos.push(b * a);
				break;
			case PODZIEL:
				if(stos.size() < 2) error();
				a = stos.top();
				stos.pop();
				b = stos.top();
				stos.pop();
				if(!a) error();
				stos.push(b / a);
				break;
			case MODULO:
				if(stos.size() < 2) error();
				a = stos.top();
				stos.pop();
				b = stos.top();
				stos.pop();
				if(!a) error();
				stos.push(b % a);
				break;
			case ERR:
				error();
			default:
				std::cerr << "switch:default --> Tu nigdy nie powinienem wejsc!!" << std::endl;
				return 2;
		}
	}

	if(stos.size() != 1) error();

	std::cout << stos.top() <<  std::endl;

	return 0;
}
